package jmine.tec.environment.db;

import java.io.File;
import java.net.URL;
import java.sql.Connection;

import jmine.tec.environment.db.server.TestDBServer;
import bancosys.tec.utils.db.converter.DbConverter;
import bancosys.tec.utils.db.executor.DbExecutor;

/**
 * Factory que devolve executor e converter para o banco que estiver em uso.
 * 
 * @author Rafael Volpato (May 11, 2007)
 * @author Gustavo Almeida (Sep 24, 2008)
 */
public class DBUtilsFactory {

    private boolean upperCaseEnabled = false;

    private final TestDBServer server;

    /**
     * Construtor.
     * 
     * @param server server
     */
    public DBUtilsFactory(TestDBServer server) {
        this.server = server;
    }

    /**
     * Diz se o upper case está habilitado ou não
     * 
     * @return se o upperCase está habilitado ou não
     */
    public boolean isUpperCaseEnabled() {
        return this.upperCaseEnabled;
    }

    /**
     * Diz se o upperCase está habilitado ou não
     * 
     * @param upperCaseEnabled se o upperCase está habilitado ou não
     */
    public void setUpperCaseEnabled(boolean upperCaseEnabled) {
        this.upperCaseEnabled = upperCaseEnabled;
    }

    /**
     * Devolve um DbExecutor.
     * 
     * @param sqlDir diretório com os scripts.
     * @param scriptFilenamePattern pattern para o nome dos scripts.
     * @param connection conexão.
     * @return DbExecutor
     * @see DbExecutor
     */
    public DbExecutor getDbExecutor(URL sqlDir, String scriptFilenamePattern, Connection connection) {
        DbExecutor dbExecutor = this.server.getDbExecutor();
        dbExecutor.setToUpper(this.isUpperCaseEnabled());
        dbExecutor.configure(connection, sqlDir);

        if (scriptFilenamePattern != null) {
            dbExecutor.setScriptPattern(scriptFilenamePattern);
        }
        return dbExecutor;
    }

    /**
     * Devolve um DbExecutor.
     * 
     * @param sqlFile arquivo do script
     * @param connection conexão.
     * @return DbExecutor
     * @see DbExecutor
     */
    public DbExecutor getDbExecutor(URL sqlFile, Connection connection) {
        return this.getDbExecutor(sqlFile, null, connection);
    }

    /**
     * Devolve um dbConverter.
     * 
     * @param input arquivo de entrada.
     * @param outputFile arquivo de saída.
     * @return dbConverter.
     */
    public DbConverter getDbConverter(URL input, File outputFile) {
        return this.server.getDbConverter(input, outputFile, this.server.getDbName());
    }
}
